#ifndef SOURCECONTINUE_HPP
#define SOURCECONTINUE_HPP

#include "Noyau/Couleur.hpp"

#include "Lumiere.hpp"

#include "Algebre/Vecteur.hpp"

#include <vector>

class Source;

/**
 * Classe abstraite définissant les sources de lumière continues, càd
 * qui normalement sont composées d'un nombre infini de sources
 * ponctuelles. Vu que l'interface de Source devrait être complètement
 * changée de manière non triviale (la source devrait avoir accès à
 * l'Environnement), on rempli simplement le segment ou la surface par
 * un grand nombre de sources lumineuses ponctuelles.
 *
 * @author Johan "Solo" Luisier
 * @date 29 Juillet 2011
 */
class SourceContinue
{
public:
  SourceContinue( const unsigned& dimension,
		  const std::vector< Coord >& limites,
		  const std::vector< unsigned >& nombres,
		  const Couleur& coul, const double& c1 = 1.,
		  const double& c2 = 0., const double& c3 = 0. );
  SourceContinue( const SourceContinue& src );
  virtual ~SourceContinue();

  const unsigned& dimension() const;

  /**
   * Permet d'obtenir le nombre de sources ajoutées à la scène.
   *
   * @return le nombre de sources élémentaires.
   */
  unsigned nombre() const;

  const std::vector< Coord >& limites() const;
  const std::vector< Coord >* limitesPtr() const;

  const std::vector< Source* >& elementsFinis() const;
  const std::vector< Source* >* elementsFinisPtr() const;

protected:
  void prepareReseauLumieres() const;

  /**
   * Retourne la position de la source élémentaire numéro \f$ i \f$.
   *
   * @param[in] i numéro de la source (indexe également une
   * distribution bidimensionelle).
   *
   * @return la position de la source.
   */
  virtual Coord positionInterpolee( const unsigned& i ) const = 0;


  /**
   * Dimension de la distribution, peut prendre deux valeurs : 1 pour
   * une distribution linéraire ou 2 pour une distribution surfacique.
   */
  unsigned Dimension;
  /**
   * Nombre de sources qui seront ajoutées à la scène par l'instance
   * courante, indexées par l'axe.
   */
  std::vector< unsigned > Nombres;
  /**
   * Bornes de la distribution, par exemples les deux extrémité d'un
   * segment de droite, les quatres coins d'un carré, ...
   */
  std::vector< Coord > Limites;

  /**
   * Couleur de la lumière.
   */
  Couleur CouleurLumiere;
  /**
   * Coefficients d'atténuation de la lumière en fonction de la
   * distance.
   */
  std::vector< double > Coefficients;
  /**
   * Type de la source lumineuse : soit il s'agit d'une source
   * ponctuelle normale ou d'une source atténuée (le type est definé
   * d'après la valeur des coefficients).
   */
  EnumSource SrcType;

  /**
   * Contient \e true si les sources on été ajoutées.
   */
  mutable bool Initialisation;

  /**
   * Conteneur des sources servant à créer l'illusion d'une
   * distribution continue.
   */
  mutable std::vector< Source* > ElementsFinis;
};

#endif // SOURCECONTINUE_HPP
